package com.sz.common.base.dao.ext;

import com.sz.common.base.dao.Dao;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

/**
 * Package: com.sz.common.base.dao.ext <br>
 * Function: TODO: ADD FUNCTION <br>
 * Author: Charles. <br>
 * Date: 2017-02-22 09:58:00.
 */
public interface DaoExt {
    Dao getDao();

    /**
     * @param tableName --表名
     * @param fields    --field values
     * @return --返回新主键
     */
    Object insertData(String tableName, final List<FieldExp> fields);

    /**
     * @param tableName --表名
     * @param list      --field values
     * @return --返回新主键
     */
    List<Object> insertDataBatch(String tableName, final List<List<FieldExp>> list);

    /**
     * 更新数据
     * 如果需要更新字段值为null，请在schema中指明对应字段的JDBC类型
     *
     * @param tableName   --数据表结构
     * @param fields      --更新字段值
     * @param whereFields --where字段值
     */
    void updateData(String tableName, final List<FieldExp> fields, final List<FieldExp> whereFields);

    /**
     * 更新数据
     * 如果需要更新字段值为null，请在schema中指明对应字段的JDBC类型
     *
     * @param tableName       --数据表结构
     * @param fieldsList      --更新字段值
     * @param whereFieldsList --where字段值
     */
    void updateDataBatch(String tableName, final List<List<FieldExp>> fieldsList,
                         final List<List<FieldExp>> whereFieldsList);

    /**
     * 删除数据
     *
     * @param tableName   --数据表结构
     * @param whereFields --where字段值
     */
    void deleteData(String tableName, final List<FieldExp> whereFields);

    /**
     * 删除数据
     *
     * @param tableName       --数据表结构
     * @param whereFieldsList --where字段值
     */
    void deleteDataBatch(String tableName, final List<List<FieldExp>> whereFieldsList);

    /**
     * 删除数据
     *
     * @param tableName --数据表结构
     * @param keyName   --关键字段
     * @param idArray   --where字段值
     */
    void deleteDataByKeys(String tableName, String keyName, final Serializable[] idArray);

    /**
     * @param tableName
     * @param returnFields
     * @param whereFields
     * @return
     */
    List<Map> selectDataList(String tableName, List<String> returnFields, final List<FieldExp> whereFields);


    /**
     * @param tableName
     * @param returnFields
     * @param whereFields
     * @return
     */
    Map selectDataObject(String tableName, List<String> returnFields, final List<FieldExp> whereFields);

    /**
     * @param tableName
     * @param whereFields
     * @return
     */
    long selectCount(String tableName, final List<FieldExp> whereFields);

}
